package juc;

/**
 * @author lzy
 * Create DateTime: 2018/7/17 14:27
 * @version v1.0
 *
 * 判断打印输出的是one还是two
 * 1. 两个普通同步方法，两个线程，标准打印，打印？ // one two
 * 2. 新增Thread.sleep(3000)给getOne，打印? // one two
 * 3. 新增普通方法getThree,打印？ three one two
 * 4. 两个普通同步方法，两个Number对象，打印? // two one
 * 5. 修改getOne为静态同步方法,一个Number对象，打印? // two one
 * 6. 修改两个方法均为静态同步方法，一个Number对象，打印? // one two
 * 7. 一个是静态同步方法，一个是非静态同步方法，两个Number对象，打印? two one
 * 8. 两个均为静态同步方法，两个Number对象，打印? // one two
 *
 * 线程八锁的关键：
 * 1. 非静态方法的锁默认为 this，静态方法的锁为 对应的Class实例
 * 2. 某一个时刻内，只能有一个线程持有锁，无论几个方法
 */
public class TestThread8Monitor {

    public static void main(String[] args) {
        Number number = new Number();
        Number number2 = new Number();

        new Thread(new Runnable() {
            @Override
            public void run() {
                number.getOne();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                number2.getTwo();
            }
        }).start();

//        number.getThree();
    }

}

class Number{
    public static synchronized void getOne(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("one");
    }

    public static synchronized void getTwo(){
        System.out.println("two");
    }

    public void getThree(){
        System.out.println("three");
    }
}